package QianFeng04;
/**Object类
 * Object是所有类的父类，任何类都默认继承Object
 * 该类中主要有以下方法: toString(),getClass(),equals(),clone(),finalize()
 * getClass(),notify(),notifyAll(),wait()等方法被定义为final类型，因此不能重写
 *
 * toString()方法:
 * 通常，tosString 方法会返回一个“以文本方式表示”此对象的字符串。
 * 结果应是一个简明且易于读懂的信息表达式。建议所有子类都重写此方法。
 *
 * equals()方法:
 * 指示其他某个对象是否与此对象相等。equals()方法在非空对象引用上实现相等关系:
 * 自反性、对称性、传递性、一致性
 * equals 与 == 的区别：
 * ==是判断两个变量或实例是不是指向同一个内存空间，是不是同一个地址
 * equals是判断两个变量或实例所指向的内存空间的值是不是相同
 * ==比较基本数据类型时，比较的是值是否相等
 * ==比较引用数据类型时，比较的是内存地址
 * equals是Object类的方法
 * 如果一个类没有重写equals方法，比较的是内存地址
 * 如果重写了equals方法，则按重写规则比较
 *
 * finalize()方法:
 * 当垃圾回收器确定不存在对该对象的更多引用时，由对象的垃圾回收器调用此方法。
 * 子类重写finalize方法，以配置系统资源或执行其他清除。
 *
 * getClass()方法:
 * 返回此Object的运行时类类型，不可重写
 *
 * clone()方法:
 * 保护方法，实现对象的浅复制，只有实现了Cloneable接口才可以调用该方法
 *      否则抛出CloneNotSupportedException异常。
 * 主要是JAVA里除了8种基本类型传参数是值传递，其他的类对象传参数都是引用传递
 * 我们有时候不希望在方法里讲参数改变，这是就需要在类中复写clone方法(实现深复制)。
 **/
public class Test9 {
    public static void main(String[] args) {
        Student student1 = new Student(37,"大神",18);
        System.out.println(student1.toString());//可以省略 .toString
        Student student2 = new Student(37,"大神",18);
        //两个不同对象，不管值是否相同，都不相等
        boolean b = student1.equals(student2);
        System.out.println("student equals "+b);//false

        String s1 = new String("落落");
        String s2 = new String("落落");
        System.out.println(s1.equals(s2));

    }
}

class Student{
    private String name;
    private int id;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Student(){}

    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    //重写Object类中的toString方法
    public String toString(){
        return "id="+id+",name="+name+",age="+age;
    }

    //重写Object类中的equals()方法，来实现两个对象的比较
    public boolean equals(Object obj){
        if (this == obj) {
            return true;
        }
        if (obj instanceof Student) {
            Student student = (Student)obj;
            if (!this.name.equals(student.name)) {
                return false;
            }
            if (this.id != student.id) {
                return false;
            }
            return this.age == student.age;
        }
        return false;
    }

}
